// 第16节：索引：索引入门
/* 
  集合中已经有了200万条的数据，可以进行索引的操作了。我们先来建立一个索引，然后看看它的查询性能到底提升了多少倍。
  这节课的内容不会很难，主要掌握索引的建立方法即可。
*/


// 普通查询性能
/* 
  我们先制作一个普通查询，随便查找一个用户名，并计算出查询和打印的时间，因为有200万条数据，所以性能不会很高。
*/
var startTime=+new Date(); //运行开始时间
var db=connect('demo15'); //链接数据库
var result=db.randomInfo.find({username:'vpqby9pm'}); //根据用户名查找用户
result.forEach(function(val){
  printjson(val);
})
var endTime=+new Date(); //查询结束时间
print('查找时间为:'+ (endTime-startTime)); //打印时间
/* 
  上边的代码就是一个普通的查询，只不过是记录了时间。在终端运行后，可以得到大概的运行时间是1381豪秒左右（电脑性能不同，有所不同），
  第一次无缓存的运行时间大概是4606豪秒左右。这个时间是没办法满足我们的日常查询的。
*/



// 建立索引
/* 
  在没有建立索引之前,会有一个默认的索引,并且查看结果是
  [
      {
              "v" : 2,
              "key" : {
                      "_id" : 1
              },
              "name" : "_id_",
              "ns" : "demo15.randomInfo"
      }
  ]
  查看索引: db.集合.getIndexes();  //可以看到索引
  建立索引: db.集合.ensureIndex({键:}) //建立索引

*/
// 试着为用户名（username）建立索引。建立索引只需要一句话就可以了。(数据库如果比较大,建立索引这个命令执行,是需要时间的,要等待)
/* 
  那现在使用命令建立一下索引db.randomInfo.ensureIndex({uername:1})，我的电脑大概要50秒左右，
  建立好后我们重新使用db.randomInfo.getIndexes()，查看一下结果。
*/
// db.randomInfo.ensureIndex({username:1});
/* 
  建立好后,会自动输出结果是否成功
  {
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
  }

  // 紧接着查看索引 db.集合.getIndexes();
  [
      {
              "v" : 2,
              "key" : {
                      "_id" : 1
              },
              "name" : "_id_",
              "ns" : "demo15.randomInfo"
      },
      {
              "v" : 2,
              "key" : {
                      "username" : 1
              },
              "name" : "username_1",
              "ns" : "demo15.randomInfo"
      }
  ]
*/


//  索引建立好后,对比之前没做索引之前查询速度对比
/* 
  然后我们在来load一下demo16.js文件（load(‘./demo16.js’)），看一下现在多少秒可以查询出来。
  这时候查询的时间缩短到了9ms左右，查询性能提升了大概153倍左右。
*/


// 总结
/* 
  总结：无论是在关系型数据库还是文档数据库，建立索引都是非常重要的。前边讲了，索引这东西是要消耗硬盘和内存资源的，
  所以还是要根据程序需要进行建立了。MongoDB也给我们进行了限制，只允许我们建立64个索引值。
*/